/**
  * 根据弧线的坐标节点数组
  */
 export function getCurvePoints(points, options) {
  options = options || {};
  var curvePoints = [];
  for (var i = 0; i < points.length - 1; i++) {
    let obj1 ={lat:points[i][1],lng:points[i][0]};
    let obj2 ={lat:points[i+1][1],lng:points[i+1][0]}
    var p = getCurveByTwoPoints(obj1, obj2, options.count);
    if (p && p.length > 0) {
      curvePoints = curvePoints.concat(p);
    }
  }
  console.log("curvePoints",curvePoints)
  return curvePoints;
}

/**
 * 根据两点获取曲线坐标点数组
 * @param Point 起点
 * @param Point 终点
 */
 export function getCurveByTwoPoints(obj1, obj2, ocount) {
  if (!obj1 || !obj2) {
    return null;
  }

  var B1 = function B1(x) {
    return 1 - 2 * x + x * x;
  };
  var B2 = function B2(x) {
    return 2 * x - 2 * x * x;
  };
  var B3 = function B3(x) {
    return x * x;
  };

  var curveCoordinates = [];

  let count = ocount || 40; // 曲线是由一些小的线段组成的，这个表示这个曲线所有到的折线的个数
  var isFuture = false;
  var t, h, h2, lat3, lng3, j, t2;
  var LnArray = [];
  var i = 0;
  var inc = 0;

  if (typeof obj2 == "undefined") {
    if (typeof curveCoordinates != "undefined") {
      curveCoordinates = [];
    }
    return;
  }

  var lat1 = parseFloat(obj1.lat);
  var lat2 = parseFloat(obj2.lat);
  var lng1 = parseFloat(obj1.lng);
  var lng2 = parseFloat(obj2.lng);

  // 计算曲线角度的方法
  if (lng2 > lng1) {
    if (parseFloat(lng2 - lng1) > 180) {
      if (lng1 < 0) {
        lng1 = parseFloat(180 + 180 + lng1);
        lng2 = parseFloat(180 + 180 + lng2);
      }
    }
  }
  // 此时纠正了 lng1 lng2
  j = 0;
  t2 = 0;
  // 纬度相同
  if (lat2 == lat1) {
    t = 0;
    h = lng1 - lng2;
    // 经度相同
  } else if (lng2 == lng1) {
    t = Math.PI / 2;
    h = lat1 - lat2;
  } else {
    t = Math.atan((lat2 - lat1) / (lng2 - lng1));
    h = (lat2 - lat1) / Math.sin(t);
  }
  if (t2 == 0) {
    t2 = t + Math.PI / 5;
  }
  h2 = h / 2;
  lng3 = h2 * Math.cos(t2) + lng1;
  lat3 = h2 * Math.sin(t2) + lat1;

  for (i = 0; i < count + 1; i++) {
    var x = lng1 * B1(inc) + lng3 * B2(inc) + lng2 * B3(inc);
    var y = lat1 * B1(inc) + lat3 * B2(inc) + lat2 * B3(inc);
    var lng1_src = obj1.lng;
    var lng2_src = obj2.lng;

    curveCoordinates.push([lng1_src < 0 && lng2_src > 0 ? x - 360 : x, y]);
    inc = inc + 1 / count;
  }
  return curveCoordinates;
}


export function calcCoorArr(point_start,point_end,num){// 入参两个坐标（字符串格式："114.30911,30.600052"）,num是返回坐标点个数
  //第一步把坐标字符串转为对象,为了方便计算转为了数字格式
    var p_start={x:parseFloat(point_start[0]),y:parseFloat(point_start[1])};
    var p_end={x:parseFloat(point_end[0]),y:parseFloat(point_end[1])};
    //此处敲黑板，是任务的第二大难点，求出相对的第三个点，用于固定曲线的弯曲度，下面公式是已知三角形两点坐标和两个坐标点的夹角求第三点坐标，两个夹角我们是自定义任意值，不过不要加起来超过180度
      // 已知两点p1(x1,y1)、p2(x2,y2)和两点所对应的角度A和B,x3、y3是对应第三点的坐标，cot25°=2.14
    //x3 = (x1*cotB+x2*cotA+y2-y1)/(cotA+cotB)
    //y3 = (y1*cotB+y2*cotA+x1-x2)/(cotA+cotB)
    let x3=(p_start.x*2.14+p_end.x*2.14-p_start.y+p_end.y)/(2*2.14)
    let y3=(p_start.y*2.14+p_end.y*2.14-p_end.x+p_start.x)/(2*2.14)
    var p_crt1={x:x3,y:y3};
    var p_crt2={x:x3,y:y3};
      //下面计算贝叶斯曲线，不是几个字能说清，直接拿去用没毛病
    /**
     * 计算公式：
     *                  | 1  0  0   0|  |P0|
     * [1 t t*t  t*t*t] |-3  3  0   0|  |P1|
     *                  |3  -6  3   0|  |P2|
     *                  |-1  3  -3  1|  |p3|
     *
     * **/
    let paths=[];
    for(let i=0;i<num+1;i++){
        let t=i/num;
        var _matrix1=[1,t,t*t,t*t*t];
        var _matrix2=[
        [1,0,0,0]
        ,[-3,3,0,0]
        ,[3,-6,3,0]
        ,[-1,3,-3,1]
        ];
        var _matrix3=[
        [p_start.x,p_start.y]
        ,[p_crt1.x,p_crt1.y]
        ,[p_crt2.x,p_crt2.y]
        ,[p_end.x,p_end.y]
        ];
        var _matrix_tmp=[
        _matrix1[0]*_matrix2[0][0]+_matrix1[1]*_matrix2[1][0]+_matrix1[2]*_matrix2[2][0]+_matrix1[3]*_matrix2[3][0]
        ,_matrix1[0]*_matrix2[0][1]+_matrix1[1]*_matrix2[1][1]+_matrix1[2]*_matrix2[2][1]+_matrix1[3]*_matrix2[3][1]
        ,_matrix1[0]*_matrix2[0][2]+_matrix1[1]*_matrix2[1][2]+_matrix1[2]*_matrix2[2][2]+_matrix1[3]*_matrix2[3][2]
        ,_matrix1[0]*_matrix2[0][3]+_matrix1[1]*_matrix2[1][3]+_matrix1[2]*_matrix2[2][3]+_matrix1[3]*_matrix2[3][3]
        ];
        var _matrix_final=[
        _matrix_tmp[0]*_matrix3[0][0]+_matrix_tmp[1]*_matrix3[1][0]+_matrix_tmp[2]*_matrix3[2][0]+_matrix_tmp[3]*_matrix3[3][0]
        ,_matrix_tmp[0]*_matrix3[0][1]+_matrix_tmp[1]*_matrix3[1][1]+_matrix_tmp[2]*_matrix3[2][1]+_matrix_tmp[3]*_matrix3[3][1]
        ];
        //下面注释掉的原因是入参是经纬度，但leaflet渲染需要的是纬度在前经度在后的数组，然后你懂的
        var _res_point=[
          _matrix_final[0]
          ,_matrix_final[1]
        ];
        // var _res_point=[_matrix_final[1],_matrix_final[0]];
        paths.push(_res_point);
    }
    return paths;
}
